;(function($){
	$.jgrid.extend({
		/**
		 * TODO:addSubGrid是jqGrid原生的方法,这里重写此方法(grid.subgrid.js)
		 */
		addSubGrid : function( pos, sind ) {
			return this.each(function(){
				var ts = this;
				if (!ts.grid ) { return; }
				//-------------------------
				var subGridCell = function(trdiv,cell,pos)
				{
					var tddiv = $("<td align='"+ts.p.subGridModel[0].align[pos]+"'></td>").html(cell);
					$(trdiv).append(tddiv);
				};
				var subGridXml = function(sjxml, sbid){
					var tddiv, i,  sgmap,
					dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"),
					trdiv = $("<tr></tr>");
					for (i = 0; i<ts.p.subGridModel[0].name.length; i++) {
						tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>");
						$(tddiv).html(ts.p.subGridModel[0].name[i]);
						$(tddiv).width( ts.p.subGridModel[0].width[i]);
						$(trdiv).append(tddiv);
					}
					$(dummy).append(trdiv);
					if (sjxml){
						sgmap = ts.p.xmlReader.subgrid;
						$(sgmap.root+" "+sgmap.row, sjxml).each( function(){
							trdiv = $("<tr class='ui-widget-content ui-subtblcell'></tr>");
							if(sgmap.repeatitems === true) {
								$(sgmap.cell,this).each( function(i) {
									subGridCell(trdiv, $(this).text() || '&#160;',i);
								});
							} else {
								var f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name;
								if (f) {
									for (i=0;i<f.length;i++) {
										subGridCell(trdiv, $(f[i],this).text() || '&#160;',i);
									}
								}
							}
							$(dummy).append(trdiv);
						});
					}
					var pID = $("table:first",ts.grid.bDiv).attr("id")+"_";
					$("#"+$.jgrid.jqID(pID+sbid)).append(dummy);
					ts.grid.hDiv.loading = false;
					$("#load_"+$.jgrid.jqID(ts.p.id)).hide();
					return false;
				};
				var subGridJson = function(sjxml, sbid){
					var tddiv,result , i,cur, sgmap,j,
					dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"),
					trdiv = $("<tr></tr>");
					for (i = 0; i<ts.p.subGridModel[0].name.length; i++) {
						tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>");
						$(tddiv).html(ts.p.subGridModel[0].name[i]);
						$(tddiv).width( ts.p.subGridModel[0].width[i]);
						$(trdiv).append(tddiv);
					}
					$(dummy).append(trdiv);
					if (sjxml){
						sgmap = ts.p.jsonReader.subgrid;
						result = sjxml[sgmap.root];
						if ( typeof result !== 'undefined' ) {
							//TODO:begin 加入判断,如果subgrid没数据不生成表头
							if(result.length>0) {
								dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"),
								trdiv = $("<tr></tr>");
								for (i = 0; i<ts.p.subGridModel[0].name.length; i++) {
									tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>");
									$(tddiv).html(ts.p.subGridModel[0].label[i]);//TODO:原jqGrid 框架没有label配置(不能国际化)
									$(tddiv).width( ts.p.subGridModel[0].width[i]);
									$(trdiv).append(tddiv);
								}
								$(dummy).append(trdiv);
							}//TODO:end
							for (i=0;i<result.length;i++) {
								cur = result[i];
								trdiv = $("<tr class='ui-widget-content ui-subtblcell'></tr>");
								if(sgmap.repeatitems === true) {
									if(sgmap.cell) { cur=cur[sgmap.cell]; }
									for (j=0;j<cur.length;j++) {
										subGridCell(trdiv, cur[j] || '&#160;',j);
									}
								} else {
									var f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name;
									if(f.length) {
										for (j=0;j<f.length;j++) {
											subGridCell(trdiv, cur[f[j]] || '&#160;',j);
										}
									}
								}
								$(dummy).append(trdiv);
							}
						}
					}
					var pID = $("table:first",ts.grid.bDiv).attr("id")+"_";
					$("#"+$.jgrid.jqID(pID+sbid)).append(dummy);
					ts.grid.hDiv.loading = false;
					$("#load_"+$.jgrid.jqID(ts.p.id)).hide();
					return false;
				};
				var populatesubgrid = function( rd )
				{
					var sid,dp, i, j;
					sid = $(rd).attr("id");
					dp = {nd_: (new Date().getTime())};
					dp[ts.p.prmNames.subgridid]=sid;
					if(!ts.p.subGridModel[0]) { return false; }
					if(ts.p.subGridModel[0].params) {
						for(j=0; j < ts.p.subGridModel[0].params.length; j++) {
							for(i=0; i<ts.p.colModel.length; i++) {
								if(ts.p.colModel[i].name === ts.p.subGridModel[0].params[j]) {
									dp[ts.p.colModel[i].name]= $("td:eq("+i+")",rd).text().replace(/\&#160\;/ig,'');
								}
							}
						}
					}
					if(!ts.grid.hDiv.loading) {
						ts.grid.hDiv.loading = true;
						$("#load_"+$.jgrid.jqID(ts.p.id)).show();
						if(!ts.p.subgridtype) { ts.p.subgridtype = ts.p.datatype; }
						if($.isFunction(ts.p.subgridtype)) {
							ts.p.subgridtype.call(ts, dp);
						} else {
							ts.p.subgridtype = ts.p.subgridtype.toLowerCase();
						}
						switch(ts.p.subgridtype) {
							case "xml":
							case "json":
							$.ajax($.extend({
								type:ts.p.mtype,
								url: ts.p.subGridUrl,
								dataType:ts.p.subgridtype,
								data: $.isFunction(ts.p.serializeSubGridData)? ts.p.serializeSubGridData.call(ts, dp) : dp,
								complete: function(sxml) {
									if(ts.p.subgridtype === "xml") {
										subGridXml(sxml.responseXML, sid);
									} else {
										subGridJson($.jgrid.parse(sxml.responseText),sid);
									}
									sxml=null;
								}
							}, $.jgrid.ajaxOptions, ts.p.ajaxSubgridOptions || {}));
							break;
						}
					}
					return false;
				};
				var _id, pID,atd, nhc=0, bfsc, r;
				$.each(ts.p.colModel,function(){
					if(this.hidden === true || this.name === 'rn' || this.name === 'cb') {
						nhc++;
					}
				});
				var len = ts.rows.length, i=1;
				if( sind !== undefined && sind > 0) {
					i = sind;
					len = sind+1;
				}
				while(i < len) {
					if($(ts.rows[i]).hasClass('jqgrow')) {
						$(ts.rows[i].cells[pos]).bind('click', function() {
							var tr = $(this).parent("tr")[0];
							r = tr.nextSibling;
							if($(this).hasClass("sgcollapsed")) {
								pID = ts.p.id;
								_id = tr.id;
								if(ts.p.subGridOptions.reloadOnExpand === true || ( ts.p.subGridOptions.reloadOnExpand === false && !$(r).hasClass('ui-subgrid') ) ) {
									atd = pos >=1 ? "<td colspan='"+pos+"'>&#160;</td>":"";
									bfsc = $(ts).triggerHandler("jqGridSubGridBeforeExpand", [pID + "_" + _id, _id]);
									bfsc = (bfsc === false || bfsc === 'stop') ? false : true;
									if(bfsc && $.isFunction(ts.p.subGridBeforeExpand)) {
										bfsc = ts.p.subGridBeforeExpand.call(ts, pID+"_"+_id,_id);
									}
									if(bfsc === false) {return false;}
									$(tr).after( "<tr role='row' class='ui-subgrid'>"+atd+"<td class='ui-widget-content subgrid-cell'><span class='ui-icon "+ts.p.subGridOptions.openicon+"'></span></td><td colspan='"+parseInt(ts.p.colNames.length-1-nhc,10)+"' class='ui-widget-content subgrid-data'><div id="+pID+"_"+_id+" class='tablediv'></div></td></tr>" );
									$(ts).triggerHandler("jqGridSubGridRowExpanded", [pID + "_" + _id, _id]);
									if( $.isFunction(ts.p.subGridRowExpanded)) {
										ts.p.subGridRowExpanded.call(ts, pID+"_"+ _id,_id);
									} else {
										populatesubgrid(tr);
									}
								} else {
									$(r).show();
								}
								$(this).html("<a href='javascript:void(0);'><span class='ui-icon "+ts.p.subGridOptions.minusicon+"'></span></a>").removeClass("sgcollapsed").addClass("sgexpanded");
								if(ts.p.subGridOptions.selectOnExpand) {
									$(ts).jqGrid('setSelection',_id);
								}
							} else if($(this).hasClass("sgexpanded")) {
								bfsc = $(ts).triggerHandler("jqGridSubGridRowColapsed", [pID + "_" + _id, _id]);
								bfsc = (bfsc === false || bfsc === 'stop') ? false : true;
								if( bfsc &&  $.isFunction(ts.p.subGridRowColapsed)) {
									_id = tr.id;
									bfsc = ts.p.subGridRowColapsed.call(ts, pID+"_"+_id,_id );
								}
								if(bfsc===false) {return false;}
								if(ts.p.subGridOptions.reloadOnExpand === true) {
									$(r).remove(".ui-subgrid");
								} else if($(r).hasClass('ui-subgrid')) { // incase of dynamic deleting
									$(r).hide();
								}
								$(this).html("<a href='javascript:void(0);'><span class='ui-icon "+ts.p.subGridOptions.plusicon+"'></span></a>").removeClass("sgexpanded").addClass("sgcollapsed");
							}
							return false;
						});
					}
					i++;
				}
				if(ts.p.subGridOptions.expandOnLoad === true) {
					$(ts.rows).filter('.jqgrow').each(function(index,row){
						$(row.cells[0]).click();
					});
				}
				ts.subGridXml = function(xml,sid) {subGridXml(xml,sid);};
				ts.subGridJson = function(json,sid) {subGridJson(json,sid);};
			});
		}
	});
})(jQuery);
